#include <stdio.h>
#include <stdlib.h>
#include <dbus/dbus.h>

int main() {
    DBusConnection *conn;
    DBusError err;
    dbus_error_init(&err);

    conn = dbus_bus_get(DBUS_BUS_SESSION, &err);
    if (dbus_error_is_set(&err)) {
        fprintf(stderr, "Connection Error (%s)\n", err.message);
        dbus_error_free(&err);
        return 1;
    }

    // 获取当前计数
    DBusMessage *msg, *reply;
    msg = dbus_message_new_method_call("com.example.Counter", "/Counter", "com.example.Counter", "get_count");
    reply = dbus_connection_send_with_reply_and_block(conn, msg, -1, &err);
    if (dbus_error_is_set(&err)) {
        fprintf(stderr, "Error getting count (%s)\n", err.message);
        dbus_error_free(&err);
        return 1;
    }

    int count;
    dbus_message_get_args(reply, &err, DBUS_TYPE_INT32, &count, DBUS_TYPE_INVALID);
    printf("Current count: %d\n", count);
    dbus_message_unref(reply);

    // 增加计数
    msg = dbus_message_new_method_call("com.example.Counter", "/Counter", "com.example.Counter", "increment");
    int increment_value = 5;
    dbus_message_append_args(msg, DBUS_TYPE_INT32, &increment_value, DBUS_TYPE_INVALID);
    dbus_connection_send(conn, msg, NULL);
    dbus_message_unref(msg);

    // 获取新的计数
    msg = dbus_message_new_method_call("com.example.Counter", "/Counter", "com.example.Counter", "get_count");
    reply = dbus_connection_send_with_reply_and_block(conn, msg, -1, &err);
    if (dbus_error_is_set(&err)) {
        fprintf(stderr, "Error getting new count (%s)\n", err.message);
        dbus_error_free(&err);
        return 1;
    }

    dbus_message_get_args(reply, &err, DBUS_TYPE_INT32, &count, DBUS_TYPE_INVALID);
    printf("New count: %d\n", count);
    dbus_message_unref(reply);

    return 0;
}


/*

D-Bus 的用途
1: 消息总线系统：D-Bus 是一个消息总线系统，允许不同的应用程序和服务在同一台计算机上进行通信。它提供了一种机制，使得应用程序可以相互发送消息、请求服务和接收通知。
2. 进程间通信（IPC）：D-Bus 主要用于进程间通信，特别是在 Linux 和其他类 Unix 操作系统中。它使得不同的进程能够以一种简单和高效的方式交换信息。
3. 服务发现：D-Bus 还支持服务发现，允许应用程序在运行时查找和连接到其他服务。
4: 桌面环境集成：D-Bus 在许多桌面环境（如 GNOME 和 KDE）中被广泛使用，用于实现组件之间的交互和协调。

sudo apt-get install libdbus-1-dev

gcc -o counter_service counter_service.c -I/usr/include/dbus-1.0 -I/usr/lib/x86_64-linux-gnu/dbus-1.0/include -ldbus-1
gcc -o counter_client counter_client.c -I/usr/include/dbus-1.0 -I/usr/lib/x86_64-linux-gnu/dbus-1.0/include -ldbus-1

*/
